/**
 * @file WiFiManager.h
 * @brief WiFi连接管理类头文件
 * 
 * 提供WiFi连接、配置模式、Web配置服务器和凭证存储功能
 * 支持自动重连和网络状态管理
 */

#ifndef WIFIMANAGER_H
#define WIFIMANAGER_H

#include <WiFi.h>
#include <WebServer.h>
#include <EEPROM.h>
#include <functional>

// EEPROM配置地址定义
#define EEPROM_SIZE 512            ///< EEPROM总大小

#define SSID_ADDR 0                ///< WiFi SSID存储地址
#define PASS_ADDR 32               ///< WiFi密码存储地址
#define MQTT_SERVER_ADDR 96        ///< MQTT服务器地址存储地址
#define MQTT_PORT_ADDR 128         ///< MQTT端口存储地址
#define MQTT_USER_ADDR 132         ///< MQTT用户名存储地址
#define MQTT_PASSWORD_ADDR 164     ///< MQTT密码存储地址
#define SENSOR_INTERVAL_ADDR 228   ///< 传感器采集间隔存储地址
#define PUBLISH_INTERVAL_ADDR 232  ///< 数据发布间隔存储地址
#define DISPLAY_INTERVAL_ADDR 236  ///< 显示更新间隔存储地址

// 定义显示回调函数类型
typedef std::function<void(String, String, String)> DisplayCallback;

class WiFiManager {
private:
    WebServer server;              ///< Web配置服务器
    String apSSID;                 ///< AP模式下的SSID
    bool isConnected;              ///< WiFi连接状态
    bool inConfigMode;             ///< 配置模式状态
    bool isConnecting;             ///< 连接中状态
    bool serverRunning;            ///< 服务器运行状态
    DisplayCallback displayCallback; ///< 显示回调函数
    
    static WiFiManager* instance;  ///< 静态实例指针用于回调
    
    // 非阻塞重连相关变量
    unsigned long lastReconnectAttempt;   ///< 上次重连尝试时间
    unsigned long reconnectInterval;      ///< 重连间隔
    bool reconnectInProgress;             ///< 重连进行中标志
    String reconnectSSID;                 ///< 重连SSID
    String reconnectPassword;             ///< 重连密码
    int reconnectAttempts;                ///< 重连尝试次数
    int maxReconnectAttempts;             ///< 最大重连尝试次数
    
    // 私有方法
    String generateAPName();
    void handleRoot();
    void handleConfig();
    void handleStatus();
    void handleNotFound();
    bool saveWiFiCredentials(String ssid, String password);
    bool connectToWiFi(String ssid, String password, int maxAttempts = 30);
    void switchToNormalMode();
    String parseJSONValue(String json, String key);
    // 新增网络扫描方法
    void handleScan();
    void handleScanResults();
    String escapeJSONString(String input);

public:
    WiFiManager();
    
    /**
     * @brief 初始化WiFi管理器
     * @return true-初始化成功, false-初始化失败
     */
    bool init();
    
    /**
     * @brief 处理客户端请求(在loop中调用)
     */
    void handleClient();
    
    // 状态查询方法
    bool isWiFiConnected();    ///< 检查WiFi是否连接
    bool isInConfigMode();     ///< 检查是否在配置模式
    bool isReconnecting();     ///< 检查是否正在重连
    String getLocalIP();       ///< 获取本地IP地址
    String getAPName();        ///< 获取AP名称
    
    /**
     * @brief 设置显示回调函数
     * @param callback 回调函数
     */
    void setDisplayCallback(DisplayCallback callback);
    
    /**
     * @brief 打印网络信息(调试用)
     */
    void printNetworkInfo();
    
    // 配置模式相关
    bool startConfigMode();    ///< 启动配置模式
    void forceCloseAP();       ///< 强制关闭AP模式
    
    // 凭证管理
    void clearWiFiCredentials();   ///< 清空WiFi凭证
    bool loadWiFiCredentials(String &ssid, String &password); ///< 加载WiFi凭证
    
    // 重连管理
    void startReconnect();     ///< 开始非阻塞重连
    void updateReconnect();    ///< 更新重连状态
    
    // MQTT配置管理
    bool saveMQTTCredentials(String server, int port, String user, String password);
    bool loadMQTTCredentials(String &server, int &port, String &user, String &password);
    void clearMQTTCredentials();

    // 间隔配置管理
    bool saveIntervalConfig(unsigned long sensorInterval, unsigned long publishInterval, unsigned long displayInterval);
    bool loadIntervalConfig(unsigned long &sensorInterval, unsigned long &publishInterval, unsigned long &displayInterval);
    void resetIntervalConfig();
    void clearIntervalConfig();
};

#endif